#!/bin/bash

deploy_module="app" 

run(){
    echo "*** 正在部署 $deploy_module ********************"
    workspace=`pwd`
    mkdir -p /data/docker/$deploy_module
    chmod -R 777 /data/docker/* 
    cp -r ./datavolume/data/docker/* /data/docker/$deploy_module
    cd /data/docker/$deploy_module
    while read line;do  
        key=`eval echo $line | awk -F"=" '{print $1}'`
        val=`eval echo $line | awk -F"=" '{print $2}'`
        if [[ "$key" && "$val" ]]; then
            echo $key"="$val
            sed -i "s#@$key#$val#g" `grep "@$key" -rl ./`
        fi
    done < $workspace/.env  
    cd $workspace
    docker-compose down
    docker-compose up -d
    echo "*** $deploy_module 部署完成 ************"
}

start(){
    if [[ "$1" ]]; then
        echo ""
        echo "*** 正在启动$1... ************************"
        docker-compose up -d $1;
    else
        echo ""
        echo "*** 正在启动$deploy_module应用... ********************"
        docker-compose up -d;
    fi
    echo ""
    echo "*** $deploy_module 启动完成 ******************************"
} 

stop(){
    if [[ "$1" ]]; then
        echo ""
        echo "*** 正在停止$1...  ************************"
        docker-compose stop $1;
    else
        echo ""
        echo "*** 正在停止$deploy_module应用... *********************"
        docker-compose stop;
    fi
} 

restart(){ 
    if [[ "$1" ]]; then
        echo ""
        echo "*** 正在重启$1... **************************"
        docker-compose restart $1;
    else
        echo ""
        echo "*** 正在重启$deploy_module应用... *********************"
        docker-compose restart;
    fi
}

remove(){ 
    if [[ "$1" ]]; then
        echo ""
        echo "*** 正在删除$1实例... ************************"
        docker rm -f $(docker ps -a |grep $1 |awk '{print $1}');
    else
        echo ""
        echo "*** 正在删除$deploy_module应用实例... ********************"
        docker-compose down;
    fi 
}

destroy(){
    IMAGEID=""
    if [[ "$1" ]]; then
        stop $1; 
        echo ""
        echo "*** 正在删除$1实例与镜像... ********************"
        IMAGEID=$(docker-compose images |grep $1 |awk '{print $4}');
    else
        echo ""
        echo "*** 正在删除$deploy_module应用实例与镜像... ***************"
        IMAGEID=$(docker-compose images |grep $deploy_module- |awk '{print $4}');
        docker-compose down;
    fi 
    docker image rm -f $IMAGEID; 
} 

package(){
    APPNAMES=$(echo ${@:2})
    APPNAMES=${APPNAMES// /|}
    if [[ "$APPNAMES" ]]; then
        echo ""
        echo "*** 正在打包镜像 $APPNAMES ... ****************************"
        mkdir -p ./;
        TIME=$(date "+%Y%m%d%H%M%S")
        IMAGES=$(docker ps |grep -E ${APPNAMES}|awk '{print $2}');
	docker save -o ./package/$deploy_module-images-part-$TIME.tar $IMAGES ;
        echo $IMAGES > ./package/$deploy_module-images-part-$TIME.txt;
        echo "*** 镜像打包完成 ************************************"
    else
        echo ""
        echo "*** 正在打包$deploy_module镜像... ****************************"
        mkdir -p ./package;
        IMAGES=$(docker-compose images|grep $deploy_module- |awk '{print $2":"$3}');
        docker save -o ./package/$deploy_module-images.tar $IMAGES
        echo "*** 镜像打包完成 ************************************" 
    fi
}

load(){
    if [[ "$1" ]]; then
        echo ""
        echo "*** 正在加载镜像 $1 ... ****************************"
        docker load -i ./package/$1;
        echo "*** 镜像加载完成 ************************************"
    else
        echo ""
        echo "*** 正在加载$deploy_module镜像... ****************************"
        docker load -i ./package/$deploy_module-images.tar;
        echo "*** 镜像加载完成 ************************************"
    fi
}



case $1 in
   "run")
      run $2;;
   "start")
      start $2;;
   "stop")
      stop $2;;
   "restart")
      restart $2;;
   "remove")
      remove $2;;
   "destroy")
      destroy $2;;
   "package")
      package $*;;
   "load")
      load $2;;
   *)
   
   echo ""
   echo "命令使用方法： ./deploy.sh MODULE COMMAND [APPNAME|FILENAME]"
   echo ""
   echo "MODULE: "
   echo "   all 所有模块，包含app、mid、db"
   echo "   app 业务应用模块"
   echo "   mid 中间件模块"
   echo "   db 数据库模块"
   echo ""
   
   echo ""
   echo "COMMAND: "
   echo "   run 初始化配置并运行应用实例，配置文件修改后需要执行此命令，否则不生效。"
   echo "   start 启动应用实例。"
   echo "   stop 停止应用实例。"
   echo "   restart 重启应用实例。"
   echo "   remove 删除应用实例。"  
   echo "   destroy 删除应用实例和镜像。"
   echo "   package 打包当前模块的镜像，此操作一般为测试发包时使用。如果只需打包部分服务镜像，使用APPNAME参数，如 ./deploy.sh app package xapi-gateway xapi-catalog，生成 app-images-part-20220614152427.tar"
   echo "   load 加载镜像，此操作加载的镜像为 package 打包的结果。加载指定的进行包，先将镜像包放在 package目录下，然后指定文件名称，如./deploy.sh app load app-images-part-20220614152427.tar"

   echo ""
   echo "APPNAME|FILENAME: "
   echo "   xapi-xxx 后台服务api。名称格式：xapi代表后台服务，xxx代表模块的名称"
   echo "   xweb-xxx 前端web应用。名称格式：xweb代表前端应用，xxx代表应用系统的名称"
   echo "   xdb-xxx 数据库。名称格式：xdb代表数据库，xxx代表数据库服务名称。"
   echo "   [MODULE]-images-part-[TIME].tar 更新包文件名称。名称格式：[MODULE]代表模块，[TIME]代表更新包生成时间。"
   echo ""
   exit 1
esac
